﻿//===============================================================================
// Microsoft patterns & practices Enterprise Library Contribution
// Exception Handling Application Block
//===============================================================================

using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration;
using Microsoft.Practices.ObjectBuilder2;

namespace EntLibContrib.ExceptionHandling.Configuration
{
	/// <summary>
	/// This type supports the Enterprise Library infrastructure and is not intended to be used directly from your code.
	/// Represents the process to build a <see cref="WrapHandler"/> described by a <see cref="WrapHandlerData"/> configuration object.
	/// </summary>
	/// <remarks>This type is linked to the <see cref="WrapHandlerData"/> type and it is used by the <see cref="ExceptionHandlerCustomFactory"/> 
	/// to build the specific <see cref="IExceptionHandler"/> object represented by the configuration object.
	/// </remarks>
	public class SqlExceptionWrapHandlerAssembler : IAssembler<IExceptionHandler, ExceptionHandlerData>
	{
		#region Public Methods
		/// <summary>
		/// This method supports the Enterprise Library infrastructure and is not intended to be used directly from your code.
		/// Builds a <see cref="WrapHandler"/> based on an instance of <see cref="WrapHandlerData"/>.
		/// </summary>
		/// <seealso cref="ExceptionHandlerCustomFactory"/>
		/// <param name="context">The <see cref="IBuilderContext"/> that represents the current building process.</param>
		/// <param name="objectConfiguration">The configuration object that describes the object to build. Must be an instance of <see cref="WrapHandlerData"/>.</param>
		/// <param name="configurationSource">The source for configuration objects.</param>
		/// <param name="reflectionCache">The cache to use retrieving reflection information.</param>
		/// <returns>A fully initialized instance of <see cref="WrapHandler"/>.</returns>
		public IExceptionHandler Assemble(IBuilderContext context, ExceptionHandlerData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
		{
			SqlExceptionWrapHandlerData castedObjectConfiguration = (SqlExceptionWrapHandlerData)objectConfiguration;

			return new SqlExceptionWrapHandler(castedObjectConfiguration);
		}
		#endregion
	}
}
